#ifndef __LINUX_LSM_UOS_HOOK_MANAGER_H
#define __LINUX_LSM_UOS_HOOK_MANAGER_H

enum UOS_HOOK_LIST {
	UOS_BINDER_SET_CONTEXT_MGR,
	UOS_BINDER_TRANSACTION,
	UOS_BINDER_TRANSFER_BINDER,
	UOS_BINDER_TRANSFER_FILE,
	UOS_PTRACE_ACCESS_CHECK,
	UOS_PTRACE_TRACEME,
	UOS_CAPGET,
	UOS_CAPSET,
	UOS_CAPABLE,
	UOS_QUOTACTL,
	UOS_QUOTA_ON,
	UOS_SYSLOG,
	UOS_SETTIME,
	UOS_VM_ENOUGH_MEMORY,
	UOS_BPRM_CHECK_SECURITY,
	UOS_BPRM_COMMITTING_CREDS,
	UOS_BPRM_COMMITTED_CREDS,
	UOS_SB_REMOUNT,
	UOS_SB_SHOW_OPTIONS,
	UOS_SB_STATFS,
	UOS_SB_MOUNT,
	UOS_SB_UMOUNT,
	UOS_SB_KERN_MOUNT,
	UOS_SB_PIVOTROOT,
	UOS_SB_CLONE_MNT_OPTS,
	UOS_DENTRY_CREATE_FILES_AS,
#ifdef CONFIG_SECURITY_PATH
	UOS_PATH_UNLINK,
	UOS_PATH_MKDIR,
	UOS_PATH_RMDIR,
	UOS_PATH_MKNOD,
	UOS_PATH_TRUNCATE,
	UOS_PATH_SYMLINK,
	UOS_PATH_LINK,
	UOS_PATH_RENAME,
	UOS_PATH_CHMOD,
	UOS_PATH_CHOWN,
	UOS_PATH_CHROOT,
#endif /* CONFIG_SECURITY_PATH */
	UOS_INODE_CREATE,
	UOS_INODE_FREE_SECURITY,
	UOS_INODE_LINK,
	UOS_INODE_UNLINK,
	UOS_INODE_SYMLINK,
	UOS_INODE_MKDIR,
	UOS_INODE_RMDIR,
	UOS_INODE_MKNOD,
	UOS_INODE_RENAME,
	UOS_INODE_READLINK,
	UOS_INODE_FOLLOW_LINK,
	UOS_INODE_PERMISSION,
	UOS_INODE_SETATTR,
	UOS_INODE_COPY_UP_XATTR,
	UOS_INODE_GETSECURITY,
	UOS_INODE_SETSECURITY,
	UOS_FILE_PERMISSION,
	UOS_FILE_IOCTL,
	UOS_MMAP_ADDR,
	UOS_MMAP_FILE,
	UOS_FILE_LOCK,
	UOS_FILE_FCNTL,
	UOS_FILE_RECEIVE,
	UOS_FILE_OPEN,
	UOS_UFILE_CLOSE,
	UOS_FILE_FREE_SECURITY,
	UOS_CRED_ALLOC_BLANK,
	UOS_CRED_FREE,
	UOS_CRED_PREPARE,
	UOS_CRED_TRANSFER,
	UOS_CRED_GETSECID,
	UOS_KERNEL_ACT_AS,
	UOS_KERNEL_CREATE_FILES_AS,
	UOS_KERNEL_MODULE_REQUEST,
	UOS_KERNEL_LOAD_DATA,
	UOS_KERNEL_READ_FILE,
	UOS_KERNEL_POST_READ_FILE,
	UOS_TASK_ALLOC,
	UOS_TASK_FREE,
	UOS_TASK_FIX_SETUID,
	UOS_TASK_SETPGID,
	UOS_TASK_GETPGID,
	UOS_TASK_GETSID,
	UOS_TASK_SETNICE,
	UOS_TASK_SETIOPRIO,
	UOS_TASK_GETIOPRIO,
	UOS_TASK_PRLIMIT,
	UOS_TASK_SETRLIMIT,
	UOS_TASK_SETSCHEDULER,
	UOS_TASK_GETSCHEDULER,
	UOS_TASK_MOVEMEMORY,
	UOS_TASK_KILL,
	UOS_TASK_PRCTL,
	UOS_IPC_PERMISSION,
	UOS_IPC_GETSECID,
	UOS_MSG_QUEUE_ASSOCIATE,
	UOS_MSG_QUEUE_MSGCTL,
	UOS_MSG_QUEUE_MSGSND,
	UOS_MSG_QUEUE_MSGRCV,
	UOS_SHM_ASSOCIATE,
	UOS_SHM_SHMCTL,
	UOS_SHM_SHMAT,
	UOS_SEM_ASSOCIATE,
	UOS_SEM_SEMCTL,
	UOS_SEM_SEMOP,
	UOS_NETLINK_SEND,
	UOS_D_INSTANTIATE,
	UOS_GETPROCATTR,
	UOS_SETPROCATTR,
	UOS_ISMACLABEL,
	UOS_SECID_TO_SECCTX,
	UOS_SECCTX_TO_SECID,
	UOS_RELEASE_SECCTX,
	UOS_INODE_INVALIDATE_SECCTX,
	UOS_INODE_NOTIFYSECCTX,
	UOS_INODE_SETSECCTX,
#ifdef CONFIG_SECURITY_NETWORK
	UOS_SOCKET_CREATE,
	UOS_SOCKET_POST_CREATE,
	UOS_SOCKET_SOCKETPAIR,
	UOS_SOCKET_BIND,
	UOS_SOCKET_CONNECT,
	UOS_SOCKET_LISTEN,
	UOS_SOCKET_ACCEPT,
	UOS_SOCKET_SENDMSG,
	UOS_SOCKET_RECVMSG,
	UOS_SOCKET_GETSOCKNAME,
	UOS_SOCKET_GETPEERNAME,
	UOS_SOCKET_GETSOCKOPT,
	UOS_SOCKET_SETSOCKOPT,
	UOS_SOCKET_SHUTDOWN,
	UOS_TUN_DEV_CREATE,
	UOS_TUN_DEV_ATTACH_QUEUE,
	UOS_TUN_DEV_ATTACH,
	UOS_TUN_DEV_OPEN,
	UOS_SCTP_ASSOC_REQUEST,
	UOS_SCTP_BIND_CONNECT,
#endif /* CONFIG_SECURITY_NETWORK */
#ifdef CONFIG_KEYS
	UOS_KEY_ALLOC,
	UOS_KEY_FREE,
	UOS_KEY_PERMISSION,
#endif
#ifdef CONFIG_AUDIT
	UOS_AUDIT_RULE_INIT,
	UOS_AUDIT_RULE_KNOWN,
	UOS_AUDIT_RULE_MATCH,
#endif /* CONFIG_AUDIT */
#ifdef CONFIG_BPF_SYSCALL
	UOS_BPF,
	UOS_BPF_MAP,
	UOS_BPF_PROG,
#endif
	UOS_HOOK_NONE,
};

enum UOS_HOOK_RETURN_TYPE {
	UOS_HOOK_RET_TY_NONE,
	UOS_HOOK_RET_TY_INT,
};

struct uos_hook_cb_entry {
	char *owner; // the module name of the hook
	unsigned long cb_addr; // the callback address of the hook
	enum UOS_HOOK_RETURN_TYPE ret_type; // the return type of the hook
	unsigned int arg_len; // the argument length of the hook
};

int uos_hook_register(enum UOS_HOOK_LIST hook_id, struct uos_hook_cb_entry *entry);
int uos_hook_cancel(enum UOS_HOOK_LIST hook_id, char *owner);

#endif
